iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
Mobile Development

Android與Spring Boot開發學習之旅系列 第 16

開發學習之旅 Day16 - 使用 JSON Web Token 進行身份驗證(三)

  • 分享至 

  • xImage
  •  

利用Security實作身分驗證

在Spring Security配置類中加入身份驗證

在SecurityConfig中加入:

.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);

完整的Spring Security配置類:

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig  {

    private final JwtAuthenticationFilter jwtAuthFilter;
    private final AuthenticationProvider authenticationProvider;

    @Bean
    public SecurityFilterChain configure(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable)  
                .authorizeHttpRequests((authorize) -> authorize 
                        .requestMatchers(
                                "/api/hello"
                        ).permitAll()   
                        .anyRequest()
                        .authenticated()   
                )
                        .authenticationProvider(authenticationProvider)
                        .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
}
  • .authenticationProvider(authenticationProvider):
    指定使用哪個AuthenticationProvider來執行身份驗證,用於驗證使用者提交名稱、密碼等認證信息。
  • .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class):
    將 jwtAuthFilter 添加到 UsernamePasswordAuthenticationFilter 之前,用於驗證和處理JWT有效性並決定使用者是否擁有訪問權限。

authenticationProvider 與 JwtAuthenticationFilter 分別負責的工作

  • AuthenticationProvider:
    • 主要負責使用者名稱和密碼身份驗證。
  • JwtAuthenticationFilter:
    • 主要負責處理基於 JWT 的身份驗證。
    • 用於實現無狀態的身份驗證,避免使用者名稱和密碼的傳輸。

使用 AuthenticationProvider 於登錄時的傳統身份驗證,一旦使用者登錄並獲得有效的 JWT,將該令牌包含在每個後續的 HTTP 請求中, JwtAuthenticationFilter 基於該令牌進行後續的請求認證,使應用程序可以實現無狀態和分散式的身份驗證,提供更高的效能與更靈活且安全的身份驗證機制。


上一篇
開發學習之旅 Day15 - 使用 JSON Web Token 進行身份驗證(二)
下一篇
開發學習之旅 Day17 - Spring Boot三層式架構
系列文
Android與Spring Boot開發學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言